﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using ObjetoNegocio;

namespace Banco
{
    public class AlgoritmoBD:BancoAbstrato<Algoritmo>
    {

        private readonly AtributoBD atributoBD;

        public  AlgoritmoBD()
        {
            atributoBD = new AtributoBD();
        }

        public override bool Remover(Algoritmo algoritmo)
        {
            throw new System.NotImplementedException();
        }

        public override bool Atualizar(Algoritmo algoritmo)
        {
            throw new System.NotImplementedException();
        }

        public override Algoritmo Pesquisar(Algoritmo algoritmo)
        {
            ComandoSql("[dbo].[cons_TBL_AlgoritmoPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codigo", algoritmo.Codigo);
            AdicionarParametroNulo("@nome", algoritmo.Nome);
            AdicionarParametroNulo("@descricao", algoritmo.Descricao);
            return ExecutarConsultaObjeto();
        }

        public override List<Algoritmo> Listar()
        {
            ComandoSql("[dbo].[cons_TBL_ALgoritmo]", CommandType.StoredProcedure);
            return ExecutarConsultarListagem();
        }

        public List<Algoritmo> ListarTop5PorBusca(Busca busca)
        {
            ComandoSql("[dbo].[cons_Top5_TBL_ALgoritmoPorCodigoBusca]", CommandType.StoredProcedure);
            AdicionarParametro("@codigoBusca", busca.Codigo);
            return ExecutarConsultarListagem();
        }
        
        public List<Algoritmo> ListarPorAvaliacao(bool gostou)
        {
            ComandoSql("[dbo].[cons_TBL_Algoritmo_PorAvaliacao]", CommandType.StoredProcedure);
            AdicionarParametro("@gostou", gostou);
            return ExecutarConsultarListagem();
        }

        public override void Inserir(Algoritmo algoritmo)
        {
            decimal codigo;
            ComandoSql("[dbo].[ins_TBL_Algoritmo]", CommandType.StoredProcedure);
            AdicionarParametro("@codigo", algoritmo.Codigo,true);
            AdicionarParametro("@nome", algoritmo.Nome);
            AdicionarParametroNulo("@descricao", algoritmo.Descricao);
            ExecutarComando(out codigo);
            algoritmo.Codigo = codigo;
            algoritmo.Atributos.ForEach(item =>InserirVinculoAlgoritmoAtributo(algoritmo,item));
        }

        private void InserirVinculoAlgoritmoAtributo(Algoritmo algoritmo,Atributo atributo)
        {
            atributo.Valores.ForEach(item =>InserirVinculoAlgoritmoAtributoValor(algoritmo,atributo,item));
        }

        private void InserirVinculoAlgoritmoAtributoValor(Algoritmo algoritmo, Atributo atributo,Valor valor)
        {
            ComandoSql("[dbo].[ins_TBL_Algoritmo_Atributo]", CommandType.StoredProcedure);
            AdicionarParametro("@codAlgoritmo", algoritmo.Codigo);
            AdicionarParametro("@codAtributo", atributo.Codigo);
            AdicionarParametroNulo("@codValorAtributo", valor.Codigo);
            ExecutarComando();
        }

        public override bool Existe(Algoritmo algoritmo)
        {
            throw new System.NotImplementedException();
        }

        protected override void MontarObjeto(ref Algoritmo algoritmo, IDataReader reader)
        {
            if (reader["CODIGO"] != DBNull.Value)
            {
                algoritmo.Codigo = (decimal)reader["CODIGO"];
                algoritmo.Atributos = atributoBD.ListarPorAlgoritmo(algoritmo);
            }

            if (reader["DESCRICAO"] != DBNull.Value)
            {
                algoritmo.Descricao = reader["DESCRICAO"].ToString();
            }

            if (reader["NOME"] != DBNull.Value)
            {
                algoritmo.Nome = reader["NOME"].ToString();
            }

        }
    }
}
